<?php

require_once 'FSessionManager.class.php';

/**
 * Classe do componente tSubdetail, que extende da classe de controle de ssessão e adiciona alguns métodos.
 *
 * @param String $sdName - Nome do componente, que será utilizado para alocar uma posição na sessão e armazenar os dados do componente.
 *
 * @author Bruno E. Fuhr [brunofuhr@yahoo.com.br]
 * @since 11/05/2011
 */
class FSubDetail extends FSessionManager
{

    public function __construct($sdName)
    {
        parent::__construct($sdName);
    }

    /**
     * Método para aplicar os dados armazenados na sessão à base de dados, conforme o seu modo atual.
     * Se o registro estiver em modo de inserção('add'), chama a função insert da classe que representa a tabela da base. No modo de alteração ('edit'), chama a função update, e no modo de exclusão ('del'), chama a função delete.
     *
     * @param String $class - Nome do arquivo que contém a classe que representa a tabela da base de dados.
     * @param String $masterId - Identificador do registro pai dos registros do componente.
     *
     * @author Bruno E. Fuhr [brunofuhr@yahoo.com.br]
     * @since 11/05/2011
     */
    public function saveData($class, $masterId)
    {
        if ( file_exists("../db/$class.class.php") )
        {
            require_once "../db/$class.class.php";
        }

        $bus = new $class();
        /* Aqui é chamada a função setMasterId(), que deve existir em todas as classes que representam tabelas totalmente dependentes de uma tabela pai.
          Esta função é responsável por setar o valor do parâmetro ao atributo correspondente. */
        $bus->setMasterId($masterId);
        $data = $this->getData();

        foreach ( $data as $line )
        {
            $lineAction = $line['mode'];

            /* Aqui os valores dos campos são enviados à classe, através dos métodos set que devem existir nela.
              Ex.: se o campo tiver a descrição 'nome', o seu valor será enviado à classe através do método setNome() */
            foreach ( $line as $key => $ln )
            {
                // Ignora os campos que servem para organização.
                if ( $key != 'sdcount' && $key != 'mode' )
                {
                    $key = 'set' . ucfirst($key);                    
                    if ( method_exists($bus, $key) )
                    {
                        $bus->$key($ln);
                    }
                }
            }

            // Aqui são chamadas as funções conforme o modo atual do registro.
            if ( $lineAction == 'add' )
            {
                $bus->insert();
            }
            elseif ( $lineAction == 'edit' )
            {
                $bus->update();
            }
            elseif ( $lineAction == 'del' )
            {
                $bus->delete();
            }
        }
    }

    /**
     * Método para buscar dados referentes ao registro que está sendo alterado e adicioná-los na sessão.
     *
     * @param String $class - Nome do arquivo que contém a classe que representa a tabela da base de dados.
     * @param String $masterId - Identificador do registro pai dos registros do componente.
     *
     * @author Bruno E. Fuhr [brunofuhr@yahoo.com.br]
     * @since 11/05/2011
     */
    public function loadData($class, $masterId)
    {
        if ( file_exists("../db/$class.class.php") )
        {
            require_once "../db/$class.class.php";
        }

        $bus = new $class();
        $bus->setMasterId($masterId);

        $data = $bus->search();
        $this->setData($data);
    }
}

?>
